package LinkedList;

public class DoubleLinkedListTest {
    public static void main(String[] args){
        Child2 child1 = new Child2(1,"小明","男");
        Child2 child2 = new Child2(2,"小红","女");
        Child2 child3 = new Child2(3,"小张","男");
        Child2 child4 = new Child2(4,"小雅","女");
        Child2 child5 = new Child2(5,"小蓝","女");
        Child2 child6 = new Child2(6,"小菲","女");
        DoubleLinkedList list = new DoubleLinkedList();
        list.add(child6);
        list.add(child3);
        list.add(child5);
        list.add(child1);
        list.add(child2);
        list.add(child4);
        list.show();


    }
}

// 定义节点
class Child2{
    int no;
    String name;
    String sex;
    Child2 next; // 指针，指向下一个节点
    Child2 pre; // 指针，指向前一个节点
    // 构造函数
    public Child2(int no, String name, String sex){
        this.no = no;
        this.name = name;
        this.sex = sex;
    }
    // 为了显示方便，我们需要重写toString方法
    @Override
    public String toString(){
        return "child [no = " + no + ", name = " + name + ", sex = " + sex + "]";
    }
}

// 定义双向链表
class DoubleLinkedList {
    // 先初始化一个头节点
    Child2 head = new Child2(0, "", ""); // 头节点不能动，也不存放任何数据

    // 向双向链表中添加节点（添加到末尾）
    public void add(Child2 child2){
        Child2 p = head; // p 为辅助指针，帮助我们遍历链表
        while(true){
            if(p.next == null){
                break;
            }
            p = p.next;
        }
        p.next = child2;
        child2.pre = p;
    }

    // 按序号添加节点
    public void add2(Child2 child2){
        Child2 p = head;
        boolean flag = false; // 标志待加入的节点是否已存在，默认为false
        while(true){
            if(p.next == null){
                break;
            }
            if(p.no > child2.no){ // 找到了
                break;
            }
            if(p.no == child2.no){
                flag = true;
                break;
            }
            p = p.next;
        }
        if(flag) {
            System.out.println("待插入的节点已经存在，不能重复添加");
        }else if ((p.next == null && p.no < child2.no) || head.next == null){
            p.next = child2;
            child2.pre = p;
        }else{
            p.pre.next = child2;
            child2.pre = p.pre;
            p.pre = child2;
            child2.next = p;
        }
    }

    // 显示链表中所有的节点
    public void show(){
        Child2 p = head.next;
        // 先判断链表是否为空
        if(head.next == null){
            System.out.println("对不起，链表为空，没有数据显示");
            return;
        }
        while(true){
            if(p == null){
                break;
            }
            System.out.println(p);
            p = p.next;
        }
    }

    // 根据编号修改节点
    public void update(Child2 newChild2){
        Child2 p = head.next;
        boolean flag = false; // 表示待修改的节点是否找到
        // 先判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空~");
        }
        while (true) {
            if (p == null) {
                break;
            } else if (p.no == newChild2.no) {
                flag = true;
                break;
            }
            p = p.next;
        }
        if (flag) {
            p.name = newChild2.name;
            p.sex = newChild2.sex;
        }else{
            System.out.println("待修改的节点没有找到");
        }
    }

    // 根据编号删除节点
    public void delete(int no){
        Child2 p = head.next;
        boolean flag = false; // 标志是否找到待删除的节点
        if (head.next == null) {
            System.out.println("链表为空~");
            return;
        }
        while (true) {
            if (p == null) {
                break;
            }
            if (p.no == no) {
                flag = true;
                break;
            }
            p = p.next;
        }
        if (flag) {
            p.pre.next = p.next;
            p.next.pre = p.pre;
        }else if(p.next == null){
            p.pre.next = null;
            p.pre = null;
        }else{
            System.out.println("待删除的节点没有找到");
        }
    }
}
